package com.rn.simple.loader;

import java.lang.reflect.Method;

/**
 * Description：Java类执行器
 *
 * @author rannuo
 * @date 2019/12/7
 */
public class JavaClassExecutor {
    /**
     * 执行外部传过来的代表一个 Java 类的 byte 数组 <br>
     * 将输入类的 byte 数组中代表 java.lang.System 的 CONSTANT_Utf8_info 常量修改为劫持后的
     * HackSystem 类
     * 执行方法为该类的 static main(String[] args) 方法，输出结果为该类向 System.out/err
     * 输出的信息
     *
     * @param classByte 代表一个 Java 类的 byte 数组
     * @return 执行结果
     */
    public static String execute(byte[] classByte, String methodName, String[] args) {
        if (classByte == null || classByte.length == 0) {
            return HackSystem.getBufferString();
        }
        HackSystem.clearBuffer();
        ClassModifier cm = new ClassModifier(classByte);
        byte[] modifyBytes = cm.modifyUTF8Constant("java/lang/System", "com/rn/simple/loader/HackSystem");

        HotSwapClassLoader loader = new HotSwapClassLoader();

        Class clazz = loader.loadByte(modifyBytes);
        try {
            Method method = clazz.getMethod(methodName, args.getClass());
            method.invoke(null, (Object) args);
        } catch (Throwable e) {
            e.printStackTrace(HackSystem.out);
        }
        return HackSystem.getBufferString();
    }

}
